作者:青青河边羊 | 来源:互联网 | 2023-10-17 20:19
篇首语:本文由编程笔记#小编为大家整理,主要介绍了UDS协议相关的知识,希望对你有一定的参考价值。
UDS的第二类诊断服务,数据传输(Data Transmission),主要包括:
- ReadDataByIdentifier (0x22)
- ReadMemoryByAddress (0x23)
- ReadScalingDataByIdentifier (0x24)
- ReadDataByPeriodicIdentifier (0x2A)
- DynamicallyDefineDataIdentifier (0x2C)
- WriteDataByIdentifier (0x2E)
- WriteMemoryByAddress (0x3D)
通常情况下,22和2E成对使用,23和3D成对使用,这几个服务应用于诊断数据的基本读写操作。24、2A、2C是一些特殊操作。
0x22和0x2E这两个服务是对以标识符(identifier)标记的数据的操作,前者是读,后者是写。UDS规定,诊断数据使用两个byte的标识符来标记,比如,0xF187用来标记ECU的零件号,0xF19E用于标记该ECU所使用的诊断文件的名字,UDS还规定了厂家可以自定义的标识符范围。
下面为读取ECU的零件号:
22 F1 87 (读取零件号)
62 F1 87 XX YY ZZ KK MM NN(给出零件号)
具体每次可以使用22服务读取几个ID,每个ID的读写权限(比如在哪些session中可以读写,是否需要安全访问操作等)。零件号这个ID是可以写入的话,则写零件号的诊断命令是:
2E F1 87 XX YY ZZ KK MM NN(写入零件号)
6E F1 87(给出positive response)
0x23和0x3D这两个服务是对以地址信息(memoryAddress )标记的数据的操作,前者是读,后者是写。这个命令的格式稍微复杂一点。以0x23为例,它的诊断请求格式是:
0x23服务的请求格式
第一部分固定为1个byte, 0x23;
第二部分是格式信息,长度为1个byte,高4 bits用于指示memorySize的长度(字节数),低4 bits用于指示memoryAddress的长度(字节数)。比如,如果这个值为0x46,则后面的memorySize为6个byte,memoryAddress为4个byte。
第三部分是memoryAddress信息,它的长度由第二部分的AddressAndLengthFormatIdentifier指示。
第四部分是memorySize信息,它的长度由第二部分的AddressAndLengthFormatIdentifier指示。
如果这条命令的格式是 23 22 xx yy aa bb,则它的含义就是,读取xx yy地址的长度为aa bb的数据。